    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cmath>
    #include <queue>
    #include <algorithm>

    #define FOR(i,a,n) for(int i=a,_n(n);i<_n;++i)
    #define REP(i,n) FOR(i,0,n)

    using namespace std;

    const double PI = acos(-1.0);

    double RandExp()
    {
        return (double)rand()/RAND_MAX;
    }

    class Point
    {
    public:
        double x,y;
        Point(double a=0,double b=0):x(a),y(b) {}
        Point RandPoint(double dist)
        {
            double deg = 2*PI*RandExp();
            return Point(x+cos(deg)*dist,y+sin(deg)*dist);
        }
        double Dist(const Point& pt)
        {
            double tx = pt.x-x;
            double ty = pt.y-y;
            return sqrt(tx*tx+ty*ty);
        }
    };

    class Circle
    {
    public:
        Point cen;
        double r;
        Circle(const Point& cen,double r):cen(cen),r(r) {}
        double GetDeg(const Point& pt)
        {
            double t = r/cen.Dist(pt);
            return 2.0*asin(t);
        }
    };

    double Cal(double a,double b,double c)
    {
        /*double avg = (a+b+c)/3.0;
        double ta = fabs(a-avg);
        double tb = fabs(b-avg);
        double tc = fabs(c-avg);
        return ta+tb+tc;
        */
        return fabs(a-b)+fabs(a-c)+fabs(b-c);
    }

    void PrintAns(vector<Circle>& cl)
    {
        const int PN = 5;
        const double EPS = 1E-9;
        const int L = 200/PN;
        double ub = max(max(cl[0].cen.y,cl[1].cen.y),cl[2].cen.y);
        double db = min(min(cl[0].cen.y,cl[1].cen.y),cl[2].cen.y);
        double lb = min(min(cl[0].cen.x,cl[1].cen.x),cl[2].cen.x);
        double rb = max(max(cl[0].cen.x,cl[1].cen.x),cl[2].cen.x);
        const double MAX_R=max(rb-lb,ub-db);
        double r = MAX_R;
        vector<Point> ans;
        vector<double> w(PN,1e6);
        ans.push_back(Point(lb,ub));
        ans.push_back(Point(rb,ub));
        ans.push_back(Point(lb,db));
        ans.push_back(Point(rb,db));
        ans.push_back(Point((lb+rb)/2,(ub+db)/2));
        //int cnt = 0;
        while(r>EPS)
        {
            REP(i,ans.size())
            {
                REP(j,L)
                {
                   // ++cnt;
                    Point pt = ans[i].RandPoint(r);
                    if(pt.x<lb||pt.x>rb) continue;
                    if(pt.y<db||pt.y>ub) continue;
                    double wt = Cal(cl[0].GetDeg(pt),
                                    cl[1].GetDeg(pt),
                                    cl[2].GetDeg(pt));
                    if(fabs(wt-0)<EPS)
                    {
                        //printf("cnt = %d\n",cnt);
                        printf("%.2f %.2f\n",pt.x,pt.y);
                        return;
                    }
                    double p = wt<w[i]?1:(r/MAX_R);
                    //if(p>0.9&&p<1) printf("exp=%f r=%f w[%d]=%f wt=%f delta=%f\n",p,r,i,w[i],wt,(w[i]-wt)*r);
                    if(RandExp()<p)
                    {
                        w[i]=wt;
                        ans[i]=pt;
                    }
                }
            }
            r *= 0.8;
        }
       // printf("cnt = %d\n",cnt);
        puts("No solution");
    }

    int main()
    {
        while(true)
        {
            Point cen[3];
            double r[3];
            REP(i,3) cin>>cen[i].x>>cen[i].y>>r[i];
            if(r[0]==0&&r[1]==0&&r[2]==0) break;
            vector<Circle> cl;
            REP(i,3) cl.push_back(Circle(cen[i],r[i]));
            PrintAns(cl);
        }
        return 0;
    }
